<?php
/**
 * Ly - 字母函数库
 *
 * 系统字母函数，单字母常用函数，便于使用
 *
 * Copyright (c) 2013 YinHailin All rights reserved.
 * @Author: YinHailin
 * @Authorize: Boren Network
 * @Created by YinHailin at 2013-11-01
 */

defined('LY_VERSION') or exit();

/*
 * 实例化模块或插件
 * @param string|array $name 需要实例化的模块名或插件名
 * @return mixed
 */
function A($name) {
  static $_action = array();
  if (strpos($name, '://')) {
    $name = str_replace('://', '/', $name);
    $baseUrl = '';
  } elseif (strpos($name, '#//')) {
    $name = str_replace('#//', '/', $name);
    $baseUrl = PLUGIN_PATH;
  } else {
    $name = '@/'.$name;
    $baseUrl = '';
  }
  if (isset($_action[$name])) return $_action[$name];
  import($name, $baseUrl);
  $class = basename($name);
  if (class_exists($class, false)) {
    $_action[$name] = new $class();
    return $_action[$name];
  } else {
    return false;
  }
}

/*
 * 获取和设置配置参数,支持批量定义
 * @param string|array $name 配置变量
 * @param mixed $value 配置值
 * @return mixed
 */
function C($name = null, $value = null) {
  static $_config = array();
  //无参数时获取所有
  if (empty($name)) {
    if (!empty($value)) {
      $_config = array_merge($_config, array_change_key_case($value));
    }
    return $_config;
  }
  //优先执行配置项的获取或赋值
  if (is_string($name)) {
    //如果$name不含'.'，则直接配置或取值
    if (!strpos($name, '.')) {
      $name = strtolower($name);
      if (is_null($value)) {
        return isset($_config[$name]) ? $_config[$name] : null;
      } else {
        $_config[$name] = $value;
      }
      return;
    }
    // 二维数组设置和获取支持
    $name = explode('.', $name);
    $name[0] = strtolower($name[0]);
    if (is_null($value)) {
      return isset($_config[$name[0]][$name[1]]) ? $_config[$name[0]][$name[1]] : null;
    } else {
      $_config[$name[0]][$name[1]] = $value;
    }
    return;
  }
  // 批量设置
  if (is_array($name)) {
    $_config = array_merge($_config, array_change_key_case($name));
    return;
  }
  return null;  //避免非法参数
}

/*
 * 文件数据快速存取
 * @param string $name 缓存名称
 * @param string $value 缓存值
 * @param array $path 缓存路径
 * @param boolean $strip 是否清除空白、注释
 * @return mixed
 */
function F($name, $value='', $path='', $strip=true) {
  if (empty($path)) { $path = RUNTIME_PATH.'Data/';}
  static $_cache = array();
  $filename = $path.$name.'.php';
  //清空、缓存数据
  if ('' !== $value) {
    if (is_null($value)) {
      //值为null则清除该缓存
      $result = false !== strpos($filename, '*') ? array_map('unlink', glob($filename)) : unlink($filename);
      return $result;
    } else {
      //缓存数据
      $dir = dirname($filename);
      //目录不存在则创建
      if (!is_dir($dir)) { mkdir($dir, 0755, true);}
      $_cache[$name] = $value;
      if ($strip) {
        return file_put_contents($filename, strip_whitespace("<?php\treturn " . var_export($value, true) . ";?>"));
      } else {
        return file_put_contents($filename, "<?php\treturn " . var_export($value, true) . ";?>");
      }
    }
  }
  //读取数据
  if (isset($_cache[$name])) { return $_cache[$name];}
  if (is_file($filename)) {
    $value = include $filename;
    $_cache[$name] = $value;
  } else {
    $value = false;
  }
  return $value;
}

/*
 * 获取和设置配置参数,支持批量定义
 * @param string $name 数据表名
 * @param string $prefix 数据表前缀
 * @param array $connect 数据库连接信息
 + eg: $connect = array('db_type'=>'mysql', 'db_host'=>'localhost', 'db_user'=>'root', 'db_password'=>'root', 'db_name'=>'brtemp5')
 * @return mixed
 */
function M($name, $prefix = '', $connect = '') {
  static $_merge = array();
  $identifier = $prefix.$name;
  if (!isset($_merge[$identifier])) {
    $_merge[$identifier] = new MergeCore($name, $prefix, $connect);
  }
  return $_merge[$identifier];
}

/*
 * 调用插件中的方法
 * @param string $plugin 插件名称，支持下划线写法和首字母大写驼峰写法
 * @param string $func  调用的插件方法
 * @param array $param  插件方法的参数
 * @return mixed
 */
function P($plugin, $func, $param = array()) {
  static $_pluginFunc;
  $plugin1 = plugin_list('core');
  $plugin2 = plugin_list('basic');
  $plugin3 = plugin_list('extend');
  $pluginList = array_merge((array)$plugin1[1], (array)$plugin2[1], (array)$plugin3[1]);
  foreach ($pluginList as $value) {
    $list[] = $value['identifier'];
  }
  $plugin = parse_name($plugin, 0);
  if (in_array($plugin, $list)) {
    $class = parse_name($plugin, 1).'Func';
    $path = PLUGIN_PATH.parse_name($plugin, 1);
    if (!array_key_exists($class, $_pluginFunc)) {
      import($class, $path);
      if (class_exists($class)) {
        $_pluginFunc[$class] = new $class();
      } else {
        return false;
      }
    }
    return call_user_func_array(array($_pluginFunc[$class], $func), $param);
  }
  return null;
}

/*
 * 文件数据存取
 * @param string $name 缓存名称
 * @param string $value 缓存值
 * @param array $path 缓存路径
 * @return mixed
 */
function S($name, $value = '', $path = '') {
  if (empty($path)) { $path = RUNTIME_PATH.'Data/';}
  static $_cache = array();
  $filename = $path.$name;
  //清空、缓存数据
  if ('' !== $value) {
    if (is_null($value)) {
      //值为null则清除该缓存
      $result = false !== strpos($filename, '*') ? array_map('unlink', glob($filename)) : unlink($filename);
      return $result;
    } else {
      //缓存数据
      $dir = dirname($filename);
      //目录不存在则创建
      if (!is_dir($dir)) { mkdir($dir, 0755, true);}
      $_cache[$name] = $value;
      return file_put_contents($filename, $value);
    }
  }
  //读取数据
  if (isset($_cache[$name])) { return $_cache[$name];}
  if (is_file($filename)) {
    $value = include $filename;
    $_cache[$name] = $value;
  } else {
    $value = false;
  }
  return $value;
}

/*
 * 重组URL
 * @param string $url url
 * @param boolean $isPlugin 是否是插件URL（插件URL不是m=???，而是plu=???）
 * @return string
 */
function U($url, $isPlugin = false) {
  $module = strtolower(C('VAR_MODULE'));
  $plugin = strtolower(C('VAR_PLUGIN'));
  $action = strtolower(C('VAR_ACTION'));
  static $_param;
  if (empty($_param)) { $param = F('url.conf', '', CONF_PATH);}
  //移除http或https头及域名，并将移除部分放入$parseUrl
  if (strpos($url, '://') !== false) {
    $regStr = '/(?:http|https):\/\/[A-Za-z0-9-\.]+\.[A-Za-z0-9-]+(?::[0-9]+)*\/*/';
    preg_match($regStr, $url, $match);
    $url = preg_replace($regStr, '', $url);
    $parseUrl = $match[0];
  }
  if (substr($url, 0, 1) == '/') { $parseUrl = '/';}
  //判断URL模式，并进行相应转换
  switch (C('URL_MODEL')) {
    case 1 :
      if (preg_match('/'.C('URL_SUFFIX').'/', $url)) {
        $parseUrl .= $url;
      } else {
        $url = parse_url($url);
        $parseUrl .= preg_replace('/\.php$/', '', $url['path']);
        if (isset($url['query'])) {
          $querySet = explode('&', $url['query']);
          foreach ($querySet as $query) {
            list($key, $value) = explode('=', $query);
            $paramArray[$key] = $value;
          }
          //模块和操作URL重建
          if ($isAdmin) {
            $module = isset($paramArray[$plugin]) ? $paramArray[$plugin] : strtolower(C('DEFAULT_MODULE'));
          } else {
            $module = isset($paramArray[$module]) ? $paramArray[$module] : strtolower(C('DEFAULT_MODULE'));
          }
          $action = isset($paramArray[$action]) ? $paramArray[$action] : strtolower(C('DEFAULT_ACTION'));
          $parseUrl .= '/'.$module;
          $parseUrl .= '/'.$action;
          //其它参数重建
          $identifier = $module.'_'.$action;
          if (isset($param[$identifier])) {
            foreach ($param[$identifier] as $i => $key2) {
              if (isset($paramArray[$key2]) && $paramArray[$key2] != '') {
                $parseUrl .= C('URL_SEPARATOR').$paramArray[$key2];
              } else {
                $parseUrl .= C('URL_SEPARATOR').'0';
              }
            }
          }
          //后缀建立
          $parseUrl .= C('URL_SUFFIX');
        }
      }
      break;
    case 0 :
    default :
      $urlSep = str_replace(array('-'), array('\-'), C('URL_SEPARATOR'));
      $regStr = '/^([^\.]*)\/([^\/]+)\/([^\/]+)\/([^\/'.$urlSep.']+)([^\/]*)\.html/';
      if (!preg_match($regStr, $url, $match)) {
        //如果不是.html文件路径，则不做处理
        $parseUrl .= $url;
      } else {
        $parseUrl = $match[1];
        //获取入口文件
        $parseUrl .= '/'.$match[2].'.php';
        //判断链接地址是否是插件地址
        if (strpos($match[3], $plugin.C('URL_SEPARATOR')) !== false) {
          //是插件地址
          $match[3] = str_replace($plugin.C('URL_SEPARATOR'), '', $match[3]);
          $parseUrl .= '?'.$plugin.'='.$match[3];
        } else {
          $parseUrl .= '?m='.$match[3];
        }
        //获取动作
        $parseUrl .= '&a='.$match[4];
        echo $parseUrl;exit();
        //TODO 继续解析
      }
  }
  return $parseUrl;
}